package com.lqian.map;

import java.util.LinkedHashMap;
import java.util.Map;


/*
 * @description: LinkedHashMap和TreeMap都可以保证某种顺序，但二者还是非常不同
 *  - LinkedHashMap 通常提供的是遍历顺序符合插入的顺序，它的实现是通过为条目(每一个条目为一个键值对)
 *  - ⚠️：通过特定构造函数，我们可以创建反映访问顺序的实例
 *  - get 、 put 、 compute 都算作 "访问"
 * 这种行为适用于一些特定应用场景：
 * - 例如，我们构建一个空间占用敏感的资源池，希望可以自动将最不常被访问的对象释放掉，
 * - 这就可以利用 LinkedHashMap 提供的机制来实现
 * -----------------------------------------------------------------------
 *  对于TreeMap,它的整体顺序是由键的顺序关系决定的，通过Comparator或Comparable(自然顺序) 来决定
 * @author: Melody_LQ 
 * @date: 2022/9/22 1:26 上午
 **/
public class LinkedHashMapSample {


    public static void main(String[] args) {
        LinkedHashMap<String, String> accessOrderedMap = new LinkedHashMap<String, String>(16, 0.75F, true){
            @Override
            protected boolean removeEldestEntry(Map.Entry<String, String> eldest) { // 实现自定义删除策略，否则行为就和普遍 Map 没有区别
                return size() > 3;
            }
        };
        accessOrderedMap.put("Project1", "Valhalla");
        accessOrderedMap.put("Project2", "Panama");
        accessOrderedMap.put("Project3", "Loom");
        accessOrderedMap.forEach( (k,v) -> {
            System.out.println("=1="+k +":" + v);
        });
        // 模拟访问 没有get Project1
        accessOrderedMap.get("Project2");
        accessOrderedMap.get("Project2");
        accessOrderedMap.get("Project3");
        System.out.println("=2="+"Iterate over should be not affected:");
        accessOrderedMap.forEach( (k,v) -> {
            System.out.println("=3="+k +":" + v);
        });
        // 触发删除 removeEldestEntry size() >3  ===>  true
        accessOrderedMap.put("Project4", "Mission Control");
        System.out.println("=4="+"Oldest entry should be removed:");
        accessOrderedMap.forEach( (k,v) -> {// 遍历顺序不变
            System.out.println(k +":" + v);
        });
    }
}
 